package com.yun.reggie.controller;

import com.yun.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author xiao
 * 文件上传下载
 */
@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.path}")
    private String path;

    @PostMapping("/upload")
    public R<String> upload(@RequestPart("file") MultipartFile photo) throws IOException {
        //接收的file是临时文件，需要转存到指定目录（下载），否则请求结束后，临时文件自动删除
        if (!photo.isEmpty()){
            String fileName = photo.getOriginalFilename();
            //动态保存
            File pathFile = new File(path);
            if (!pathFile.exists()){
                //如果保存图片的目录不存在，则新建一个
                pathFile.mkdirs();
            }
            //如果上传同名的文件，会将原文件覆盖掉(内容覆盖)
            String uuidName = UUID.randomUUID().toString();
            //获取后缀名
            String suffixName = fileName.substring(fileName.lastIndexOf("."));
            //新文件名，确保不会重复
            fileName = uuidName+suffixName;

            //最终保存位置应该：photo目录 +分隔符 +文件名
            photo.transferTo(new File(path+File.separator+fileName));
            //需要返回图片名
            return R.success(fileName);
        }
        return R.error("上传文件不能为空！");
    }

    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException{
        //创建输入流，读取文件
        FileInputStream inputStream = new FileInputStream(path+File.separator+name);
        //创建输出流，输出文件
        ServletOutputStream outputStream = response.getOutputStream();
        //设置下载文件类型
        response.setContentType("image/jpeg");

        //创建字节数组，保存读取的内容
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1){
            //read读取数据的下一个字节，如果达到文件的末尾，则返回-1
            outputStream.write(bytes,0,len);
            outputStream.flush();
        }
        inputStream.close();
        outputStream.close();
    }
}
